// ==UserScript== // @name 超星 To Csv // @version 0.1.4 // @description 将你的超星学习通里的作业数据、随堂练习导出成为 Csv 文件,方便导入 Anki 背题 // @author Nexmoe // @github https://github.com/nexmoe/chaoxing2csv // @namespace https://nexmoe.com/ // @match *://*.chaoxing.com/* // @license MIT // ==/UserScript== // 在此处键入代码…… let css = () => { let style = document.createElement("style"); style.type = "text/css"; let text = document.createTextNode("textarea { border: 1px solid; width: 100%; resize: none;}"); style.appendChild(text); let head = document.getElementsByTagName("head")[0]; head.appendChild(style); } let generateTextArea = (data) => { let node = document.createElement("textarea"); let textnode = document.createTextNode(data); node.appendChild(textnode); if (document.getElementsByClassName("detailsHead").length > 0) { document.getElementsByClassName("detailsHead")[0].appendChild(node); } else { document.getElementsByClassName("top-box")[0].appendChild(node); } } function ConvertToCSV(objArray) { var array = typeof objArray != 'object' ? JSON.parse(objArray) : objArray; var str = ''; for (var i = 0; i < array.length; i++) { var line = ''; for (var index in array[i]) { if (line != '') line += ',' line += array[i][index]; } str += line + '\r\n'; } return str; } let saveFile = (data) => { const blob = new Blob([data], { type: 'text/csv;charset=utf-8;' }); const Url = URL.createObjectURL(blob); let link = document.createElement('a'); if (document.getElementsByClassName("item-name").length > 0) { link.download = document.getElementsByClassName("item-name")[0].innerText + '.csv'; //文件名字 } else { link.download = document.getElementsByClassName("mark_title")[0].innerText + '.csv'; //文件名字 } link.href = Url; link.appendChild(document.createTextNode('下载题目数据')); if (document.getElementsByClassName("detailsHead").length > 0) { document.getElementsByClassName("detailsHead")[0].appendChild(link); } else { document.getElementsByClassName("top-box")[0].appendChild(link); } } let optionsFilter = (dom, i = 0, strings = "") => { for (i = 0; i < dom.children.length; i++) { if (i < (dom.children.length - 1)) { strings = strings + dom.children[i].innerText + "||"; } else { strings = strings + dom.children[i].innerText; } } return strings.replace( new RegExp(",", "gm"), "," ).replace( new RegExp("\n", "gm"), "" ); } let answersFilter = (dom, i = 0, strings = "") => { answer = dom.innerText.replace("正确答案: ", "").replace( new RegExp(",", "gm"), "," ).replace( new RegExp(" ", "gm"), "" ).replace( new RegExp("对", "gm"), "A" ).replace( new RegExp("错", "gm"), "B" ); for (i = 0; i < answer.length; i++) { if (i < (answer.length - 1)) { strings = strings + (answer.charCodeAt(i) - 64) + "||" } else { strings = strings + (answer.charCodeAt(i) - 64) } } return strings; } let questionsFilter = (dom, answers, i = 0, strings = "") => { question = dom.innerHTML.replace( new RegExp(",", "gm"), "," ).replace( new RegExp("\n", "gm"), "" ).replace( new RegExp("http://", "gm"), "https://" ); answer = answers.innerText.replace("正确答案: ", "").replace( new RegExp(",", "gm"), "," ).replace( new RegExp(" ", "gm"), "" ).replace( new RegExp("对", "gm"), "A" ).replace( new RegExp("错", "gm"), "B" ); for (i = 0; i < answer.length; i++) { strings = strings + "{{c" + (i+ 1) + "::}}" } return question + strings; } let getData = (i, data = []) => { let questions, selections, answers, notes; if (document.getElementsByClassName("mark_name").length > 0) { questions = document.getElementsByClassName("mark_name"); selections = document.getElementsByClassName("mark_letter"); answers = document.getElementsByClassName("colorGreen"); } else { questions = document.getElementsByClassName("topic-title"); selections = document.getElementsByClassName("topic-options"); answers = document.getElementsByClassName("color-green"); } for (i = 0; i < questions.length; i++) { data.push({ id: String(new Date().getTime()) + String(Math.floor(Math.random() * 100000)), question: questionsFilter(questions[i], answers[i]), options: optionsFilter(selections[i]), answer: answersFilter(answers[i]), }) } console.log(data) return data; } (function () { css(); if (document.getElementsByClassName("mark_name").length > 0) { generateTextArea(JSON.stringify(getData())); saveFile(ConvertToCSV(JSON.stringify(getData()))); } else { setTimeout(() => { generateTextArea(JSON.stringify(getData())); saveFile(ConvertToCSV(JSON.stringify(getData()))); }, 1000) } })();